package co.edu.udea.herbario.bb;

import co.edu.udea.herbario.bl.InformacionEjemplar;
import co.edu.udea.herbario.dto.*;
//import java.awt.event.ActionEvent;
import com.icesoft.faces.context.effects.JavascriptContext;
import java.util.ArrayList;
import javax.faces.event.ActionEvent;
import java.util.Date;
import javax.faces.context.FacesContext;

/**
 * Esta clase contiene la implementacion de los metodos planteados para la recuperacion de un solo ejemplar
 * 
 * @author Marcela Colorado
 */

public class EjemplarBean
{
    //Definicion de atributos de la clase
    Integer numero;
    String codigoBarras;
    Valorestipo colorFlor;
    Valorestipo colorFruto;
    Integer continente;
    String continenteTexto;
    double dap;
    Integer departamento;
    String departamentoTexto;
    Integer elevacionMaxima;
    Integer elevacionMinima;
    Integer especie;
    String especieNombre;
    Valorestipo estadoReproductivo;
    String esteOeste;
    Integer familia;
    String familiaNombre;
    String fechaColeccion;
    String fechaDeterminacion;
    Valorestipo formaIngreso;
    Integer genero;
    String generoNombre;
    double gradosLatitud;
    double gradosLongitud;
    String grupoColeccion;
    Valorestipo habito;
    String localidad;
    Valorestipo materialTipo;
    double minutosLatitud;
    double minutosLongitud;
    Integer municipio;
    String municipioTexto;
    String nombreAutor;
    String nombreCientifico;
    String nombreColectorPrincipal;
    String nombreComun;
    String nombreDeterminador;
    Valorestipo nombreInstitucion;
    String norteSur;
    String notas;
    String numeroColeccion;
    String otrosColectores;
    Integer pais;
    String paisTexto;
    String porConfirmar;
    String publicarCoordenadas;
    double segundosLatitud;
    double segundosLongitud;
    String subespecie;
    Valorestipo tipoMontaje;
    String variedad;

    double coordenadasLatitud;  //Coordenadas latitud de la ubicacion del ejemplar en valor decimal
    char signoLatitud;
    double coordenadasLongitud; //Coordenadas longitud de la ubicacion del ejemplar en valor decimal
    char signoLongitud;
    
    Ejemplar ejem;  //Objeto para encapsular los datos del ejemplar traidos desde la bd
    ArrayList <String> nombresCientificos = null;
    InformacionEjemplar infoEjem = null;

    String elevacionTexto;
    String coordenadasLatitudTexto;
    String coordenadasLongitudTexto;
    String valorNomCien;    //variable para buscar los nombres cientificos

    /**
     * Constructor de la clase EjemplarBean
     */
    public EjemplarBean()
    {
       ejem = new Ejemplar();
       infoEjem = new InformacionEjemplar();
    }

    /**
     * Metodo que obtiene todos los datos del ejemplar asociado al numero ingresado como parametro de busqueda
     *
     * @param event
     */
    public void recuperarEjemplar(ActionEvent event)
    {
        //Obtencion del ejemplar asociado al consecutivo indicado como parametro
        ejem = infoEjem.obtenerEjemplar(numero);

        //Asignacion de los valores del objeto ejem a cada uno de los campos correspondientes en la clase
        numero = ejem.getNumero();
        codigoBarras = ejem.getCodigoBarra();
        colorFlor = ejem.getColorFlor();
        colorFruto = ejem.getColorFruto();
        continente = ejem.getContinente();
        continenteTexto = ejem.getContinenteTexto();
        dap = ejem.getDap();
        departamento = ejem.getDepartamento();
        departamentoTexto = ejem.getDepartamentoTexto();
        elevacionMaxima = ejem.getElevacionMaxima();
        elevacionMinima = ejem.getElevacionMinima();
        especie = ejem.getEspecie().getCodigo();
        especieNombre = ejem.getEspecie().getNombre();
        estadoReproductivo = ejem.getEstadoReproductivo();
        esteOeste = ejem.getEsteOeste();
        familia = ejem.getFamilia().getCodigo();
        familiaNombre = ejem.getFamilia().getNombre();
        fechaColeccion = ejem.getFechaColeccion();
        fechaDeterminacion = ejem.getFechaDeterminacion();
        formaIngreso = ejem.getFormaIngreso();
        genero = ejem.getGenero().getCodigo();
        generoNombre = ejem.getGenero().getNombre();
        gradosLatitud  = ejem.getGradosLatitud();
        gradosLongitud = ejem.getGradosLongitud();
        grupoColeccion = ejem.getGrupoColeccion();
        habito = ejem.getHabito();
        localidad = ejem.getLocalidad();
        materialTipo = ejem.getMaterialTipo();
        minutosLatitud = ejem.getMinutosLatitud();
        minutosLongitud = ejem.getMinutosLongitud();
        municipio = ejem.getMunicipio();
        municipioTexto = ejem.getMunicipioTexto();
        nombreAutor = ejem.getNombreAutor();
        nombreCientifico = ejem.getNombreCientifico();
        nombreColectorPrincipal = ejem.getNombreColectorPrincipal();
        nombreComun = ejem.getNombreComun();
        nombreDeterminador = ejem.getNombreDeterminador();
        nombreInstitucion = ejem.getNombreInstitucion();
        norteSur = ejem.getNorteSur();
        notas = ejem.getNotasCampo();
        numeroColeccion = ejem.getNumeroColeccion();
        otrosColectores = ejem.getOtrosColectores();
        pais = ejem.getPais();
        paisTexto = ejem.getPaisTexto();
        porConfirmar = ejem.getPorConfirmar();
        publicarCoordenadas = ejem.getPublicarCoordenadas();
        segundosLatitud = ejem.getSegundosLatitud();
        segundosLongitud = ejem.getSegundosLatitud();
        subespecie = ejem.getSubespecie();
        tipoMontaje = ejem.getTipoMontaje();
        variedad = ejem.getVariedad();

        //Conversion de la latitud y longitud donde esta ubicado el ejemplar a coordenadas validas
        //para el api de Google Maps
        if(norteSur != null)
        {
            if(norteSur.charAt(0) == 'N' || norteSur.charAt(0) == 'n')
            {
                coordenadasLatitud = gradosLatitud + (minutosLatitud / 60) + (segundosLatitud / 3600);
            }
            else
            {
                coordenadasLatitud = -(gradosLatitud + (minutosLatitud / 60) + (segundosLatitud / 3600));
            }
        }
        else
        {
            coordenadasLatitud = 0;
        }
        

        if(esteOeste != null)
        {
            if(esteOeste.charAt(0) == 'E' || esteOeste.charAt(0) == 'e')
            {
                coordenadasLongitud = gradosLongitud + (minutosLongitud / 60) + (segundosLongitud / 3600);
            }
            else
            {
                  coordenadasLongitud = -(gradosLongitud + (minutosLongitud / 60) + (segundosLongitud / 3600));
            }
        }
        else
        {
            coordenadasLongitud = 0;
        }

        if(elevacionMaxima == 0)
            {this.elevacionTexto = "ND";}
        else
            {this.elevacionTexto = elevacionMaxima.toString();}

        if(gradosLatitud == 0 && minutosLatitud == 0 && segundosLatitud == 0)
            {this.coordenadasLatitudTexto = "ND";}
        else
        {
            this.coordenadasLatitudTexto = "" + gradosLatitud + "°" + minutosLatitud + "\"" + segundosLatitud + "'" + norteSur;
        }

        if(gradosLongitud == 0 && minutosLongitud == 0 && segundosLongitud == 0)
            {this.coordenadasLongitudTexto = "ND";}
        else
        {
            this.coordenadasLongitudTexto = "" + gradosLongitud + "°" + minutosLongitud + "\"" + segundosLongitud + "'" + esteOeste;
        }

        JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(),"recuperarEjemplaresEspecie('"+this.especieNombre+"');");
    }

    /**
     * Metodo que retorna los nombres cientificos asociados a los diferentes ejemplares
     * 
     * @param partNomCien corresponde a la cadena que deben contener los nombres cientificos retornados
     * @return
     */
    public ArrayList <String> recuperarNombresCientificos(String partNomCien)
    {
        nombresCientificos = infoEjem.obtenerNombresCientificos(partNomCien);
        return nombresCientificos;
    }

    // Metodos get y set de los atributos de la clase
    
    public String getCodigoBarras() {
        return codigoBarras;
    }

    public void setCodigoBarras(String codigoBarras) {
        this.codigoBarras = codigoBarras;
    }

    public Valorestipo getColorFlor() {
        return colorFlor;
    }

    public void setColorFlor(Valorestipo colorFlor) {
        this.colorFlor = colorFlor;
    }

    public Valorestipo getColorFruto() {
        return colorFruto;
    }

    public void setColorFruto(Valorestipo colorFruto) {
        this.colorFruto = colorFruto;
    }

    public Integer getContinente() {
        return continente;
    }

    public void setContinente(Integer continente) {
        this.continente = continente;
    }

    public double getDap() {
        return dap;
    }

    public void setDap(Integer dap) {
        this.dap = dap;
    }

    public Integer getDepartamento() {
        return departamento;
    }

    public void setDepartamento(Integer departamento) {
        this.departamento = departamento;
    }

    public Ejemplar getEjem() {
        return ejem;
    }

    public void setEjem(Ejemplar ejem) {
        this.ejem = ejem;
    }

    public Integer getElevacionMaxima() {
        return elevacionMaxima;
    }

    public void setElevacionMaxima(Integer elevacionMaxima) {
        this.elevacionMaxima = elevacionMaxima;
    }

    public Integer getElevacionMinima() {
        return elevacionMinima;
    }

    public void setElevacionMinima(Integer elevacionMinima) {
        this.elevacionMinima = elevacionMinima;
    }

    public Integer getEspecie() {
        return especie;
    }

    public void setEspecie(Integer especie) {
        this.especie = especie;
    }

    public Valorestipo getEstadoReproductivo() {
        return estadoReproductivo;
    }

    public void setEstadoReproductivo(Valorestipo estadoReproductivo) {
        this.estadoReproductivo = estadoReproductivo;
    }

    public String getEsteOeste() {
        return esteOeste;
    }

    public void setEsteOeste(String esteOeste) {
        this.esteOeste = esteOeste;
    }

    public Integer getFamilia() {
        return familia;
    }

    public void setFamilia(Integer familia) {
        this.familia = familia;
    }

    public String getFechaColeccion() {
        return fechaColeccion;
    }

    public void setFechaColeccion(String fechaColeccion) {
        this.fechaColeccion = fechaColeccion;
    }

    public String getFechaDeterminacion() {
        return fechaDeterminacion;
    }

    public void setFechaDeterminacion(String fechaDeterminacion) {
        this.fechaDeterminacion = fechaDeterminacion;
    }

    public Valorestipo getFormaIngreso() {
        return formaIngreso;
    }

    public void setFormaIngreso(Valorestipo formaIngreso) {
        this.formaIngreso = formaIngreso;
    }

    public Integer getGenero() {
        return genero;
    }

    public void setGenero(Integer genero) {
        this.genero = genero;
    }

    public double getGradosLatitud() {
        return gradosLatitud;
    }

    public void setGradosLatitud(double gradosLatitud) {
        this.gradosLatitud = gradosLatitud;
    }

    public double getGradosLongitud() {
        return gradosLongitud;
    }

    public void setGradosLongitud(double gradosLongitud) {
        this.gradosLongitud = gradosLongitud;
    }

    public String getGrupoColeccion() {
        return grupoColeccion;
    }

    public void setGrupoColeccion(String grupoColeccion) {
        this.grupoColeccion = grupoColeccion;
    }

    public Valorestipo getHabito() {
        return habito;
    }

    public void setHabito(Valorestipo habito) {
        this.habito = habito;
    }

    public InformacionEjemplar getInfoEjem() {
        return infoEjem;
    }

    public void setInfoEjem(InformacionEjemplar infoEjem) {
        this.infoEjem = infoEjem;
    }

    public String getLocalidad() {
        return localidad;
    }

    public void setLocalidad(String localidad) {
        this.localidad = localidad;
    }

    public Valorestipo getMaterialTipo() {
        return materialTipo;
    }

    public void setMaterialTipo(Valorestipo materialTipo) {
        this.materialTipo = materialTipo;
    }

    public double getMinutosLatitud() {
        return minutosLatitud;
    }

    public void setMinutosLatitud(double minutosLatitud) {
        this.minutosLatitud = minutosLatitud;
    }

    public double getMinutosLongitud() {
        return minutosLongitud;
    }

    public void setMinutosLongitud(double minutosLongitud) {
        this.minutosLongitud = minutosLongitud;
    }

    public Integer getMunicipio() {
        return municipio;
    }

    public void setMunicipio(Integer municipio) {
        this.municipio = municipio;
    }

    public String getNombreAutor() {
        return nombreAutor;
    }

    public void setNombreAutor(String nombreAutor) {
        this.nombreAutor = nombreAutor;
    }

    public String getNombreCientifico() {
        return nombreCientifico;
    }

    public void setNombreCientifico(String nombreCientifico) {
        this.nombreCientifico = nombreCientifico;
    }

    public String getNombreColectorPrincipal() {
        return nombreColectorPrincipal;
    }

    public void setNombreColectorPrincipal(String nombreColectorPrincipal) {
        this.nombreColectorPrincipal = nombreColectorPrincipal;
    }

    public String getNombreComun() {
        return nombreComun;
    }

    public void setNombreComun(String nombreComun) {
        this.nombreComun = nombreComun;
    }

    public String getNombreDeterminador() {
        return nombreDeterminador;
    }

    public void setNombreDeterminador(String nombreDeterminador) {
        this.nombreDeterminador = nombreDeterminador;
    }

    public Valorestipo getNombreInstitucion() {
        return nombreInstitucion;
    }

    public void setNombreInstitucion(Valorestipo nombreInstitucion) {
        this.nombreInstitucion = nombreInstitucion;
    }

    public String getNorteSur() {
        return norteSur;
    }

    public void setNorteSur(String norteSur) {
        this.norteSur = norteSur;
    }

    public String getNotas() {
        return notas;
    }

    public void setNotas(String notas) {
        this.notas = notas;
    }

    public Integer getNumero() {
        return numero;
    }

    public void setNumero(Integer numero) {
        System.out.println("Setiando numero " + numero);
        this.numero = numero;
    }

    public String getNumeroColeccion() {
        return numeroColeccion;
    }

    public void setNumeroColeccion(String numeroColeccion) {
        this.numeroColeccion = numeroColeccion;
    }

    public String getOtrosColectores() {
        return otrosColectores;
    }

    public void setOtrosColectores(String otrosColectores) {
        this.otrosColectores = otrosColectores;
    }

    public Integer getPais() {
        return pais;
    }

    public void setPais(Integer pais) {
        this.pais = pais;
    }

    public String getPorConfirmar() {
        return porConfirmar;
    }

    public void setPorConfirmar(String porConfirmar) {
        this.porConfirmar = porConfirmar;
    }

    public String getPublicarCoordenadas() {
        return publicarCoordenadas;
    }

    public void setPublicarCoordenadas(String publicarCoordenadas) {
        this.publicarCoordenadas = publicarCoordenadas;
    }

    public double getSegundosLatitud() {
        return segundosLatitud;
    }

    public void setSegundosLatitud(double segundosLatitud) {
        this.segundosLatitud = segundosLatitud;
    }

    public double getSegundosLongitud() {
        return segundosLongitud;
    }

    public void setSegundosLongitud(double segundosLongitud) {
        this.segundosLongitud = segundosLongitud;
    }

    public String getSubespecie() {
        return subespecie;
    }

    public void setSubespecie(String subespecie) {
        this.subespecie = subespecie;
    }

    public Valorestipo getTipoMontaje() {
        return tipoMontaje;
    }

    public void setTipoMontaje(Valorestipo tipoMontaje) {
        this.tipoMontaje = tipoMontaje;
    }

    public String getVariedad() {
        return variedad;
    }

    public void setVariedad(String variedad) {
        this.variedad = variedad;
    }

    public double getCoordenadasLatitud() {
        return coordenadasLatitud;
    }

    public void setCoordenadasLatitud(double coordenadasLatitud) {
        this.coordenadasLatitud = coordenadasLatitud;
    }

    public double getCoordenadasLongitud() {
        return coordenadasLongitud;
    }

    public void setCoordenadasLongitud(double coordenadasLongitud) {
        this.coordenadasLongitud = coordenadasLongitud;
    }

    public String getEspecieNombre() {
        return especieNombre;
    }

    public void setEspecieNombre(String especieNombre) {
        this.especieNombre = especieNombre;
    }

    public String getFamiliaNombre() {
        return familiaNombre;
    }

    public void setFamiliaNombre(String familiaNombre) {
        this.familiaNombre = familiaNombre;
    }

    public String getGeneroNombre() {
        return generoNombre;
    }

    public void setGeneroNombre(String generoNombre) {
        this.generoNombre = generoNombre;
    }

    public String getContinenteTexto() {
        return continenteTexto;
    }

    public void setContinenteTexto(String continenteTexto) {
        this.continenteTexto = continenteTexto;
    }

    public String getCoordenadasLatitudTexto() {
        return coordenadasLatitudTexto;
    }

    public void setCoordenadasLatitudTexto(String coordenadasLatitudTexto) {
        this.coordenadasLatitudTexto = coordenadasLatitudTexto;
    }

    public String getCoordenadasLongitudTexto() {
        return coordenadasLongitudTexto;
    }

    public void setCoordenadasLongitudTexto(String coordenadasLongitudTexto) {
        this.coordenadasLongitudTexto = coordenadasLongitudTexto;
    }

    public String getDepartamentoTexto() {
        return departamentoTexto;
    }

    public void setDepartamentoTexto(String departamentoTexto) {
        this.departamentoTexto = departamentoTexto;
    }

    public String getElevacionTexto() {
        return elevacionTexto;
    }

    public void setElevacionTexto(String elevacionTexto) {
        this.elevacionTexto = elevacionTexto;
    }

    public String getMunicipioTexto() {
        return municipioTexto;
    }

    public void setMunicipioTexto(String municipioTexto) {
        this.municipioTexto = municipioTexto;
    }

    public ArrayList<String> getNombresCientificos() {
        return nombresCientificos;
    }

    public void setNombresCientificos(ArrayList<String> nombresCientificos) {
        this.nombresCientificos = nombresCientificos;
    }

    public String getPaisTexto() {
        return paisTexto;
    }

    public void setPaisTexto(String paisTexto) {
        this.paisTexto = paisTexto;
    }

    public char getSignoLatitud() {
        return signoLatitud;
    }

    public void setSignoLatitud(char signoLatitud) {
        this.signoLatitud = signoLatitud;
    }

    public char getSignoLongitud() {
        return signoLongitud;
    }

    public void setSignoLongitud(char signoLongitud) {
        this.signoLongitud = signoLongitud;
    }       
}
